/*eslint-disable*/
// 加法函数
function accAdd(arg1, arg2) {
  var r1, r2, m
  try {
    r1 = arg1.toString().split('.')[1].length
  } catch (e) {
    r1 = 0
  }
  try {
    r2 = arg2.toString().split('.')[1].length
  } catch (e) {
    r2 = 0
  }
  m = Math.pow(10, Math.max(r1, r2))
  return (arg1 * m + arg2 * m) / m
}

// 减法函数
function accSub(arg1, arg2) {
  var r1, r2, m, n
  try {
    r1 = arg1.toString().split('.')[1].length
  } catch (e) {
    r1 = 0
  }
  try {
    r2 = arg2.toString().split('.')[1].length
  } catch (e) {
    r2 = 0
  }
  m = Math.pow(10, Math.max(r1, r2))
  // 动态控制精度长度
  n = (r1 >= r2) ? r1 : r2
  return (arg1 * m - arg2 * m) / m
}

// 乘法函数
function accMul(arg1, arg2) {
  var m = 0
  var s1 = arg1.toString()
  var s2 = arg2.toString()
  try {
    m += s1.split('.')[1].length
  } catch (e) {}
  try {
    m += s2.split('.')[1].length
  } catch (e) {}
  return Number(s1.replace('.', '')) * Number(s2.replace('.', '')) / Math.pow(10, m)
}

// 除法函数
function accDiv(arg1, arg2) {
  var t1 = 0
  var t2 = 0
  var r1; var r2
  try {
    t1 = arg1.toString().split('.')[1].length
  } catch (e) {}
  try {
    t2 = arg2.toString().split('.')[1].length
  } catch (e) {}
  r1 = Number(arg1.toString().replace('.', ''))
  r2 = Number(arg2.toString().replace('.', ''))
  return (r1 / r2) * Math.pow(10, t2 - t1)
}

/**
 * 此方法参数为：
 * @param num1: 第一个需要操作的数字。

 * @param num2: 第二个需要操作的数字。

 * @param oper: 操作符，现在支持 +，-，*，/四个符号,只能为字符串。

 * @param precision: 浮点数精度(选填,默认2位,返回的计算结果的小数点位数)。
 */
const math = function(num1, num2, oper, percision) {
  if (isNaN(num1) || num1 === null || num1 === '') {
    console.warn('math 第一个参数必须有值且能转换为数字')
    return ''
  }

  if (isNaN(num2) || num2 === null || num2 === '') {
    console.warn('math 第一个参数必须有值且能转换为数字')
    return ''
  }

  if (!new RegExp('\\+|\\-|\\*|\\/').test(oper)) {
    console.error("'" + oper + "' 不是有效的运算符(+,-,*,/)")
  }

  var result = 0
  switch (oper) {
    case '+':
      result = accAdd(num1, num2)
      break
    case '-':
      result = accSub(num1, num2)
      break
    case '*':
      result = accMul(num1, num2)
      break
    case '/':
      result = accDiv(num1, num2)
      break
  }

  if (percision == null) {
    return result.toString()
  }

  // 默认保留2位小数
  percision = percision || 2
  return (result.toFixed(percision)).toString()
}
export default math
